1.【模擬面試追問|規格與驗收】 舊 App 有三條「把東西交給另一個人」的流程:
狀態分散在三個地方:
流程相關的布林旗標約 7 個,相關畫面都沒有實作 onSaveInstanceState。
你在文章裡寫了一句「我把 QR 交接改成一個 sealed 狀態機」。面試官順著往下問,不看下面的大綱,依序回答:
從發起方的角度把 QR 交接畫成狀態:列出每個狀態的名稱、帶的資料,以及能離開它的事件。「已刷出、等對方刷入」是不是一個狀態?發起方怎麼知道對方刷入了:輪詢、推播,還是根本不知道?選一個,並說出它的代價。
順序是「先刷出、後給碼」。對方一直沒來刷入,貨品在誰名下?碼過期之後呢?發起方的 App 這時該顯示什麼、能做什麼:重取碼、撤回,還是什麼都不做?撤回需要後端提供什麼?如果後端沒有撤回 API,你的驗收條件要怎麼寫才誠實?
截止時刻是「收到回應當下的手機時鐘+相對秒數」。手機時鐘慢五分鐘,或使用者在倒數途中改了系統時間,倒數會怎樣?你會用哪一個時鐘?把「過期」寫成一條驗收條件,要讓注入時鐘的 JVM 測試抓得到這個邊界。
接收方遇到下面四個情境:
逐一說明:狀態機停在哪個狀態、使用者看到什麼、重送安不安全,以及冪等性要靠誰保證。
任務轉手的發起方「送出就結束」,接收方的鈕「不看狀態」。面試官問「這也算握手嗎?」你怎麼回?新設計要不要讓發起方看得到對方的回應?要的話,後端最少要多給什麼?
最後回答:這些狀態裡,哪些是 App 自己的狀態,哪些其實是後端的狀態、App 只是負責顯示?程序被回收後,你要還原哪些?
我的回答:(待補)
2.【決策邊界|架構論述】 同一個交接流程,狀態機要放在哪裡?三個選項:
TransferUiState,在 onEvent 裡用 when 直接轉移。「數量相符才能送出」「過期了不能再用」這類規則也寫在 ViewModel。(State, Event) -> Transition(newState, effects),沒有 Android 依賴。ViewModel 只負責執行 effect(呼叫 API、計時),再把領域狀態映射成 UiState。不看下面的大綱,依序回答:
runTest 的設計條件。SavedStateHandle:(A)、(B)、(C) 各要存什麼才還原得回來?「接收方比對到一半的清單」要不要存?存了的話,會不會跟後端的實際狀態對不上?對不上時以誰為準?最後用兩句話收尾:你的結論,以及你願意承認的代價。
我的回答:(待補)